package com.zking.db;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import com.zking.entityClass.BookInfo;


/**
 * 数据库操作类
 * @author ZC
 *
 */
public class BaseDao {

	public static QueryRunner runner=null;
	static {
		runner = new QueryRunner(DBPool.getInstance().getDataSource());
	}
	//获取数据源连接
	public Connection getConn() throws SQLException {
		return runner.getDataSource().getConnection();
	}
	//关闭数据源连接
	public void closeConnection() throws SQLException {
		runner.getDataSource().getConnection().close();
	}
	          /*批量执行SQL语句*/
	/**
	 * 批量执行sql语句
	 * @param sql
	 * @param params  每一行表示一条SQL语句所需的参数
	 * @return 每条SQL语句影响的行数 所组成的数组
	 * @throws SQLException
	 */
	public int[] batch(String sql,Object[][] params) throws SQLException {
		return runner.batch(sql, params);
	}
	          /*修改操作*/
	
	/**
	 * 修改数据库
	 * @param sql
	 * @param params
	 * @return  影响的行数
	 * @throws SQLException
	 */
	public int update(String sql,Object ...params) throws SQLException {
		Object num=runner.update(sql,params);
		return num==null?0:(int)num;
	}
	public int update(String sql) throws SQLException {
		Object num=runner.update(sql);
		return num==null?0:(int)num;
	}
	
	              /*查询操作*/
	
	/**
	 * 将结果集中的第一行数据封装到一个对应的JavaBean实例中。
	 * @param <T>
	 * @param beanClass
	 * @param sql
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public <T> T findBean(Class<T> beanClass,String sql,Object ...params) throws SQLException{
		return runner.query(sql,new BeanHandler<T>(beanClass),params);
	}
	public <T> T findBean(Class<T> beanClass,String sql) throws SQLException{
		return runner.query(sql,new BeanHandler<T>(beanClass));
	}
	/**
	 * 将结果集中的第一行数据存放到对象，在放到list集合中
	 * @param <T>
	 * @param beanClass
	 * @param sql
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public <T> List<T> findList(Class<T> beanClass,String  sql,Object ...params) throws SQLException{
		return runner.query(sql,new BeanListHandler<T>(beanClass),params);
	}
	public <T> List<T> findList(Class<T> beanClass,String  sql) throws SQLException{
		return runner.query(sql,new BeanListHandler<T>(beanClass));
	}
	/**
	 * 将结果集中第一行列的数据存成整数（用于聚集函数）
	 * @param sql
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public int getCount(String sql,Object ...params) throws SQLException {
		Object obj= runner.query(sql,new ScalarHandler<Object>(),params);
		if(obj==null){
	    	return 0;
	    }else {
	    	return (int)obj;
	    }
	}
	public int getCount(String sql) throws SQLException {
		Object obj= runner.query(sql, new ScalarHandler<Object>());//将结果集中某一条记录的其中某一列的数据存成Object。
	    if(obj==null){
	    	return 0;
	    }else {
	    	return (int)obj;
	    }
	}
	
	/**
	 * 1.把结果集中的第一行数据转成对象数组。
	 * @param sql
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public Object[] queryArrayHandler(String sql,Object... params) throws SQLException {
		return runner.query(sql,new ArrayHandler(), params);
	}
	public Object[] queryArrayHandler(String sql) throws SQLException {
		return runner.query(sql,new ArrayHandler());
	}
	/**
	 *2. 把结果集中的每一行数据都转成一个对象数组object[]，再存放到List中
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public List<Object[]> queryArrayListHandler(String sql) throws SQLException {
		return runner.query(sql,new ArrayListHandler());
	}
	public List<Object[]> queryArrayListHandler(String sql,Object... params) throws SQLException {
		return runner.query(sql,new ArrayListHandler(),params);
	}
	/**
	 * 3.将结果集中某一列的数据存放到List中
	 * @param sql
	 * @param columnName
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public List<Object> queryColumnListHandler(String sql,String columnName,Object ...params) throws SQLException {
		return runner.query(sql,new ColumnListHandler<Object>(columnName),params);
	}
	public List<Object> queryColumnListHandler(String sql,String columnName) throws SQLException {
		return runner.query(sql,new ColumnListHandler<Object>(columnName));
	}
	/**
	 * 4.将结果集中的每一行数据都封装到一个Map里，然后再根据指定的key把每个Map再存放到一个Map里。
	 * @param sql
	 * @param columnName
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public <T>Map<T, Map<String, Object>>  queryKeyedHandler(String sql,Object ...params) throws SQLException {
		return runner.query(sql,new KeyedHandler<T>(),params);
	}
	public <T>Map<T, Map<String, Object>>  queryKeyedHandler(String sql) throws SQLException {
		return runner.query(sql,new KeyedHandler<T>());
	}
	/**
	 * 5.将结果集中的第一行数据封装到一个Map里，key是列名，value就是对应的值。
	 * @param sql
	 * @param columnName
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public Map<String,Object> queryMapHandler(String sql,Object ...params) throws SQLException {
		return runner.query(sql,new MapHandler(),params);
	}
	public Map<String,Object> queryMapHandler(String sql) throws SQLException {
		return runner.query(sql,new MapHandler());
	}
	/**
	 * 6.将结果集中的每一行数据都封装到一个Map里，然后再存放到List。
	 * @param sql
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public List<Map<String, Object>> queryMapListHandler(String sql,Object ...params) throws SQLException {
		return runner.query(sql,new MapListHandler(),params);
	}
	public List<Map<String, Object>> queryMapListHandler(String sql) throws SQLException {
		return runner.query(sql,new MapListHandler());
	}
	public static void main(String[] args) {
		BaseDao base=new BaseDao();
		String sql="SELECT * FROM bookinfo WHERE TYPE=?";
		List<BookInfo> stu=null;
		try {
			stu = base.findList(BookInfo.class,sql,"教辅");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}//必须写实体类student的get,set
		System.out.println(stu);
	}
}
